package pam.metier;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import pam.entities.Cotisation;
import pam.entities.Employe;
import pam.entities.Indemnite;
import pam.repositories.CotisationRepository;
import pam.repositories.EmployeRepository;
import pam.repositories.IndemniteRepository;

import java.util.Iterator;
import java.util.List;

@Service("métier")
public class Metier implements IMetier {

    //repositories
    @Autowired
    private EmployeRepository employeRepository;
    @Autowired
    private CotisationRepository cotisationRepository;
    @Autowired
    private IndemniteRepository indemniteRepository;

    @Override
    public List<Employe> getEmployes() {
        return (List<Employe>) employeRepository.findAll();
    }

    @Override
    public FeuilleSalaire getFeuilleSalaire(String ss, double ht, int jt) {
        //retrouve les employés ayant le ss souhaité dans la base de donnée, il n'y en a normalemnt un seul
        Iterator<Employe> itEmploye = employeRepository.findBySS(ss).iterator();
        //parcour cette liste
        if(itEmploye.hasNext()) {
            //l'employé est stocké dans e
            Employe e = itEmploye.next();

            //retrouve la cotisation dans la base de donnée
            Cotisation c = cotisationRepository.findAll().iterator().next();
            if(c == null)
            {
                throw new PamException("Cotisation not found.", 102);
            }

            //retrouve l'indémnité corespondant à l'employé
            Indemnite i = e.getIndemnite();
            if(i == null)
            {
                throw new PamException("Indemnite not found.", 103);
            }

            //calcul le salaire
            double salaireBase = (ht * i.getBaseHeure()) * (1 + (i.getIndemnitesCP() / 100));
            double cotisationsSociales = salaireBase * ((c.getCsgrds() + c.getCsgd() + c.getSecu() + c.getRetraite()) / 100);
            double indemnitesEntretien = jt * i.getEntretienJour();
            double indemnitesRepas = jt * i.getRepasJour();
            double salaireNet = Math.round(100*(salaireBase - cotisationsSociales + indemnitesEntretien + indemnitesRepas));
            salaireNet = salaireNet/100;

            //stock les salaire dans une instance d'ElementsSalaire
            ElementsSalaire es = new ElementsSalaire(
                    salaireBase,
                    cotisationsSociales,
                    indemnitesEntretien,
                    indemnitesRepas,
                    salaireNet);

            //crée une instance de fs contenant toute les informations puis la retoune
            FeuilleSalaire fs = new FeuilleSalaire(e, c, es);
            return fs;
        }
        else
        {
                throw new PamException("L'employe n°["+ss+"] est introuvable.", 101);
        }
    }
}
